package kr.co.bettersoft.pushchat.activity;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.CommonUtil;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.ImageFile;
import kr.co.bettersoft.pushchat.domain.PushChatDiary;

import org.json.JSONArray;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * DiaryWriteActivity
 *  일기쓰기
 *   상단 일기쓰기 타이틀. 좌측상단 닫기 버튼.
 *   일상 / 유머 / 지식 / 기타 .  카테고리 버튼으로 선택
 *   제목 입력란
 *   내용 입력란
 *   이미지 추가 삭제 버튼. 섬네일 이미지.
 *   하단 일기 등록 버튼
 * @author blue
 *
 */
public class DiaryWriteActivity extends Activity{
	////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수 

	String TAG = "DiaryWriteActivity";

	public final int REQ_CODE_PICK_PICTURE = 601;				// 이미지 선택 코드. activity result 받기 위한 값

	public final int REGISTER_DIARY = 602;						// 공지 등록 관련 서버 통신 메소드 호출 코드


	public final int MAX_WIDTH = CommonConstant.UPLOAD_IMAGE_SIZE_BIG;				// 업로드 이미지 큰변 길이 800
	public final int MAX_HEIGHT = CommonConstant.UPLOAD_IMAGE_SIZE_SMALL;			// 업로드 이미지 작은변 길이 600


	public String COLOR_SELECTED = "#ff0000";
	public String COLOR_NOT_SELECTED = "#000000";


	//  아이디 	
	String userId = "";

	// 공용 프립스	
	SharedPreferences sharedPrefCustom;

	// 서버 통신
	int isRunning = 0;		// 통신 도중 중복 호출을 방지하기 위함.
	PushChatRest pushChatRest;
	String callResult = "";
	String tempstr = "";
	JSONArray jsonArray;

	// 선택한 이미지
	public static Bitmap selectedImg = null;
	// 선택된 카테고리명
	public String selectedCategory = "";

	// 화면 구성
	TextView titleBar;		// 타이틀

	Button  categoryCommonBtn;			 
	Button  categoryHumorBtn;			 
	Button  categoryKnowledgeBtn;			 
	Button  categoryEtcBtn;			 

	Button  selectImgBtn;			// 이미지 선택 버튼
	Button  deleteImgBtn;			// 이미지 삭제 버튼
	ImageView selectImgThumbView;	// 섬네일 이미지
	EditText diaryWriteTitle;		// 공지 제목
	EditText diaryWriteContent;	// 상세 내용
	Button  registerBtn;		// 공지 등록 버튼		
	ProgressBar pb1;				// 중단 로딩 진행바

	Button topNaviCloseBtn; 		// 상단 닫기 버튼

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;		
	InputMethodManager imm;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 핸들러 설정

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showYN")==1){
					isRunning = 0;
				}
				if(b.getInt("initScreen")==1){
					selectImgThumbView.setImageDrawable(getResources().getDrawable((R.drawable.empty_diary)));	// ### 
					diaryWriteTitle.setText("");
					diaryWriteContent.setText("");
					selectedImg = null;
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}else if(b.getInt("showAlert")==4){
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							finish();
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}
				switch (msg.what)
				{
				case REGISTER_DIARY : runOnUiThread(new RunnableRegisterDiary());			
				break;
				default : 
					break;
				}


			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		//		Log. w(TAG,"onCreate");
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.diary_write_activity);

		pushChatRest = new PushChatRest();

		parentLayout = findViewById(R.id.parent_layout);	

		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});

		titleBar = (TextView) findViewById(R.id.title_bar);
		categoryCommonBtn  = (Button) findViewById(R.id.category_common_btn);
		categoryHumorBtn  = (Button) findViewById(R.id.category_humor_btn);
		categoryKnowledgeBtn  = (Button) findViewById(R.id.category_knowledge_btn);
		categoryEtcBtn  = (Button) findViewById(R.id.category_etc_btn);
		selectImgBtn  = (Button) findViewById(R.id.select_img_btn);
		deleteImgBtn  = (Button) findViewById(R.id.delete_img_btn);
		registerBtn  = (Button) findViewById(R.id.register_btn);
		selectImgThumbView = (ImageView) findViewById(R.id.select_img_thumb_view);
		diaryWriteTitle = (EditText) findViewById(R.id.notice_write_title);
		diaryWriteContent = (EditText) findViewById(R.id.notice_write_content);
		pb1=(ProgressBar) findViewById(R.id.notice_write_progressbar);

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//				Log. w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(diaryWriteTitle.getWindowToken(), 0);
			}
		});

		// 이미지 선택하기
		selectImgBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(diaryWriteTitle.getWindowToken(), 0);
				Intent imgSelectIntent = new Intent(Intent.ACTION_PICK);
				imgSelectIntent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
				imgSelectIntent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);	// images on the SD card

				// 결과를 리턴하는 activity 호출
				startActivityForResult(imgSelectIntent, REQ_CODE_PICK_PICTURE);	
			}
		});  
		// 이미지 삭제하기
		deleteImgBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(diaryWriteTitle.getWindowToken(), 0);

				//				Uri curImgURI = data.getData();
				try {
					//					selectedImg = Images.Media.getBitmap(getContentResolver(), curImgURI );
					Drawable drawableNoImg = getResources().getDrawable(R.drawable.sub7_4);
					BitmapDrawable bmpDrawableNoImg = (BitmapDrawable) drawableNoImg;
					selectedImg = bmpDrawableNoImg.getBitmap(); 
					// 섬네일 초기화
					selectImgThumbView.setImageBitmap(selectedImg);
					selectedImg = null;
				} catch (Exception e) { e.printStackTrace(); }

				//				Intent imgSelectIntent = new Intent(Intent.ACTION_PICK);
				//				imgSelectIntent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
				//				imgSelectIntent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);	// images on the SD card
				//				
				//				// 결과를 리턴하는 activity 호출
				//				startActivityForResult(imgSelectIntent, REQ_CODE_PICK_PICTURE);	
			}
		});  

		// 등록하기
		registerBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				if((diaryWriteTitle.getText()+"").length()<1){
					// 제목을 입력하세요.
					showResultDialog(getString(R.string.input_subject));
				}else if((diaryWriteContent.getText()+"").length()<1){		
					// 내용을 입력하세요.
					showResultDialog(getString(R.string.input_content));
				}else{
					handler.sendEmptyMessage(REGISTER_DIARY);
					//						registerNotice();
				}
			}
		});

		// noticeRegisterBtn.onClick
		//		Log.d(TAG,"now mil :" + CommonUtil.getNowDateMiliSec());

		// 가맹점 아이디를 꺼낸다.
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		userId = sharedPrefCustom.getString("userId", "");

		// 키보드 숨기기
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		imm .hideSoftInputFromWindow(diaryWriteTitle.getWindowToken(), 0);
	}

	// 카테고리 선택 리스너
	// 사진
	public void onClickSelectCategory(View v) {
		selectedCategory = (String) v.getTag();
		categoryCommonBtn.setTextColor(Color.parseColor(COLOR_NOT_SELECTED));
		categoryHumorBtn.setTextColor(Color.parseColor(COLOR_NOT_SELECTED));
		categoryKnowledgeBtn.setTextColor(Color.parseColor(COLOR_NOT_SELECTED));
		categoryEtcBtn.setTextColor(Color.parseColor(COLOR_NOT_SELECTED));
		switch(v.getId()) {
		case R.id.category_common_btn:
			categoryCommonBtn.setTextColor(Color.parseColor(COLOR_SELECTED));
			break;
		case R.id.category_humor_btn:
			categoryHumorBtn.setTextColor(Color.parseColor(COLOR_SELECTED));
			break;
		case R.id.category_knowledge_btn:
			categoryKnowledgeBtn.setTextColor(Color.parseColor(COLOR_SELECTED));
			break;
		case R.id.category_etc_btn:
			categoryEtcBtn.setTextColor(Color.parseColor(COLOR_SELECTED));
			break;
		}
	}



	///////////////////////////////////// 	 /////////////////////////////////////

	//   로그 
	public void alertToUser(){				// 	data 조회가  안됐어요. 
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	/**
	 * 러너블.  일기를 등록한다
	 */
	class RunnableRegisterDiary implements Runnable {
		public void run(){
			new backgroundThreadRegisterDiary().execute();
		}
	}
	/**
	 * backgroundThreadRegisterDiary
	 * 비동기    서버와 통신하여 일기를 등록한다
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterDiary extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadRegisterDiary");

			Log.d(TAG,"userId:"+userId);
			Log.d(TAG,"selectedCategory:"+selectedCategory);
			Log.d(TAG,"diaryWriteTitle:"+diaryWriteTitle.getText());
			Log.d(TAG,"diaryWriteContent:"+diaryWriteContent.getText());

			// 파라미터 세팅
			PushChatDiary pushChatDiaryParam = new PushChatDiary();
			pushChatDiaryParam.setMemberId(userId);
			pushChatDiaryParam.setCategory(selectedCategory);
			pushChatDiaryParam.setSubject(diaryWriteTitle.getText()+"");
			pushChatDiaryParam.setContent(diaryWriteContent.getText()+"");
			pushChatDiaryParam.setFileUrl("");

			if(selectedImg == null){
				//				eventNoticeParam.setImageFileUrl("");
				//				 mpEntity.addPart("file", new StringBody(""));
				//				params.add(new BasicNameValuePair("file", ""));		// ? 파일이 없을때 공백으로 보내면 에러가 발생함. 안보내도 에러가 발생함.
			}else{
				Log.d(TAG,"img size:"+selectedImg.getWidth()+"x"+selectedImg.getHeight());
				selectedImg = resizeBitmapImage(selectedImg, MAX_WIDTH, MAX_HEIGHT);	 		// resize
				Log.d(TAG,"img size2:"+selectedImg.getWidth()+"x"+selectedImg.getHeight());				
				//				imageFileParam.setFileName(fineName);		// 이름은 나중에 rest에서 설정함
				pushChatDiaryParam.setFile(selectedImg);
			}

			// 서버 통신
			showPb();
			try {
				if(selectedImg == null){
					callResult = pushChatRest.RestRegisterDiary(pushChatDiaryParam);		
				}else{
					callResult = pushChatRest.RestRegisterDiaryWithImage(pushChatDiaryParam, returnThis());		
				}
				Log.d(TAG,"callResult::"+callResult);
			} catch (Exception e) {
				e.printStackTrace();
			} 
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				initScreen();		// 화면 초기화
				showResultDialogAndFinish(getString(R.string.reg_success));
			}else{
				isRunning = 0;
				showResultDialog(getString(R.string.reg_fail));
				//					getDBData();			// db에서 꺼내서 보여준다.
			}
			return null; 
		}
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 이미지 선택 결과를 받아 처리한다.
	 */
	@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){
		if(requestCode == REQ_CODE_PICK_PICTURE){
			if(resultCode==Activity.RESULT_OK){
				//					selectImgThumbView.setImageURI(data.getData());	// 선택한 사진 URI 로 연결하기

				// uri 에서 이미지 가져오기
				Uri curImgURI = data.getData();
				try {
					selectedImg = Images.Media.getBitmap(getContentResolver(), curImgURI );
				} catch (Exception e) { e.printStackTrace(); }
				// 섬네일 적용
				selectImgThumbView.setImageBitmap(selectedImg);
			}
		}
	}


	//////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * Bitmap이미지의 가로, 세로 사이즈를 리사이징 한다.
	 * 
	 * @param source 원본 Bitmap 객체
	 * @param maxResolution 제한 해상도
	 * @return 리사이즈된 이미지 Bitmap 객체
	 */
	public Bitmap resizeBitmapImage(Bitmap source, int maxWidth, int maxHeight)	{	// maxWidth 800 maxHeight 600
	
		int width = source.getWidth();
		int height = source.getHeight();

		Bitmap resizedBitmapImage;

		if(width > height){		// 너비가 더 크면 800 * 600 
			resizedBitmapImage = Bitmap.createScaledBitmap(source, maxWidth, maxHeight, true);
		} else {		// 높이가 더 크면 600 * 800
			resizedBitmapImage = Bitmap.createScaledBitmap(source, maxHeight, maxWidth, true);
		}
		return resizedBitmapImage;
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////	
	//		Util	

	/**
	 * 컨택스트 리턴
	 */
	public Context returnThis(){
		return this;
	}

	/**
	 * showInfo
	 *  결과를 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	/**
	 * 화면을 초기화한다.
	 */
	public void initScreen(){
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("initScreen", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}

	/**
	 * showResultDialog
	 *   얼럿 띄운다 
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * showResultDialogAndFinish
	 *   얼럿 띄우고 확인 누르면 종료.  
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialogAndFinish(final String msg){
		DiaryWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 4);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

}
